﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Laba1
{
    public class StudentCard:IPrintable
    {
        private string _name;
        private List<Achivement> _tasks = new List<Achivement>();
        private Subject _subject;

        public StudentCard(string name, Subject subject)
        {
            _name = name;
            _subject = subject;
        }

        public void AddPracticalTask(DateTime date, int ratingForQuality, int ratingForDate, PracticalTask task)
        {
            if(GetByTask(task) == null)
            {
                _tasks.Add(Achivement.CreatePracticalTask(date, ratingForQuality, ratingForDate, task));   
            } else
            {
                _tasks[_tasks.IndexOf(GetByTask(task))] = Achivement.CreatePracticalTask(date, ratingForQuality, ratingForDate, task);
            }
            
        }

        public void AddBoundaryControl(DateTime date,int rating, BoundaryControl control)
        {
            if (GetByTask(control) == null)
            {
                _tasks.Add(Achivement.CreateBoundaryControl(date, rating, control));    
            } else
            {
                _tasks[_tasks.IndexOf(GetByTask(control))] = Achivement.CreateBoundaryControl(date, rating, control);
            }
            
        }
        public void AddFinalControl(DateTime date, int rating, FinalControl control)
        {
            _tasks.Add(Achivement.CreateFinalControl(date, rating, control));
        }
        //что можно поставить
        public int FinalRating()
        {
            int finalRating = 0;
            if(_tasks.Count!=(_subject.BoundaryControls.Count+_subject.PracticalTasks.Count)) return 0;//если количство заданий у студента не совпадает с количеством заданий в пердмете значит он не все сдал
            foreach (var achivement in _tasks)
            {
                if (!(achivement.Task is FinalControl) && !achivement.isPass()) return 0;//если задание не итоговое и не сдано
                else
                {
                    finalRating += achivement.Rating;
                }
            }
            return finalRating;
        }

        public List<Achivement> Tasks
        {
            get { return _tasks; }
        }
        //Сдавал ли студент задание вообще
        public Achivement GetByTask(Task task)
        {
            foreach (var achivement in _tasks)
            {
                if (achivement.Task.Equals(task)) return achivement;
            }
            return null;
        }

        //Список того что не сдал
        public List<Task> GetListDebt()
        {
            List<Task> debt=new List<Task>();
            foreach (var task in _subject.PracticalTasks)
            {
                if (GetByTask(task) == null || !GetByTask(task).isPass()) //если задания нет в списке студента или оно не сдано
                {
                    debt.Add(task); 
                }
            }
            foreach (var task in _subject.BoundaryControls)
            {
                if (GetByTask(task) == null || !GetByTask(task).isPass())
                {
                    debt.Add(task);
                }
            }
            if(GetByTask(_subject.FinalControl)==null || !GetByTask(_subject.FinalControl).isPass())//если итогового котроля нет в списке или он не сдан
            {
                debt.Add(_subject.FinalControl);
            }
            return debt;
        }

        public string Name
        {
            get { return _name; }
        }

        //потом удалить(печатает задание в консоль)
        public void print()
        {
            Console.WriteLine("{0}",  Name);
        }
    }
}
